Description
While viewing a live game, show a Golazo-style strip of selectable game boxes at the top (above the watched game's score box): other live games (same league first, then other leagues) plus today's finals. User can tab/arrow between boxes and press enter to switch the detail view to that game. Data comes from already-polled a.games β no new fetch loop.
Acceptance Criteria
- #1 Detail view renders a ticker strip of compact game boxes above the watched game's score box
- #2 Ticker shows live games (same league first, then others) then today's finals, excluding the watched game
- #3 tab/right and shift+tab/left move ticker selection; enter switches the detail view to the selected game
- #4 Up/Down still scroll the detail body; selected ticker box is visually highlighted
- #5 Strip windows horizontally to keep selection on screen with off-screen affordances; hidden when no other games
Implementation Notes
Added internal/ui/ticker.go (tickerGames ordering, tickerStrip horizontal windowing, tickerCell mini-box). Wired into detail.go via detailBoxBlock (stacks ticker over score box; shared by detailView + detailScrollMax so body height stays correct). Nav in update.go: NextLg/PrevLg move tickerCursor, Enter routes through shared openDetail to switch games. Added App.tickerCursor. Tests in ticker_test.go cover ordering/exclusion, window clamping, and a render smoke test.
Final Summary
Adds a Golazo-style live ticker to the detail view: a strip of selectable game boxes above the watched game's score box showing other live games (same league first, then others) then today's finals, sourced from already-polled a.games (no new fetch). tab/β and β§tab/β move the selection, enter switches the detail view to that game; β/β still scroll the body. Strip windows horizontally with βΉ βΊ off-screen affordances and hides when nothing else is on. New ticker.go + App.tickerCursor + shared openDetail helper; detailScrollMax/detailBodyAvail account for the strip's height. Tests + go vet/build pass.